package com.ug.system.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ug.common.enums.ErrorCode;
import com.ug.common.exception.SystemException;
import com.ug.common.id.SnowFlakeFactory;
import com.ug.common.utils.BeanUtils;
import com.ug.system.entity.SysDict;
import com.ug.system.entity.dto.QueryDto;
import com.ug.system.entity.dto.SysDictDto;
import com.ug.system.mapper.SysDictMapper;
import com.ug.system.service.SysDictService;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  字典服务实现类
 * </p>
 *
 * @author LY
 * @since 2024-08-13 10:56:19
 */
@Service
public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements SysDictService {

    @Override
    public void editDict(SysDictDto sysDictDto) {
        checkDict(sysDictDto);
        SysDict sysDict = new SysDict();
        BeanUtils.copyProperties(sysDictDto, sysDict);
        sysDict.setEnabled(sysDictDto.getEnabled());
        if (sysDictDto.getDictId() == null){
            sysDict.setDictId(SnowFlakeFactory.getSnowFlakeFromCache().nextId());
            baseMapper.insert(sysDict);
        }else {
            baseMapper.updateById(sysDict);
        }
    }

    @Override
    public IPage<SysDict> getSysDictList(QueryDto queryDto, SysDictDto sysDictDto){
        LambdaQueryWrapper<SysDict> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(SysDict::getCreateTime);
        if (StrUtil.isNotEmpty(sysDictDto.getDictName())){
            queryWrapper.eq(SysDict::getDictName, sysDictDto.getDictName());
        }
        if (StrUtil.isNotEmpty(sysDictDto.getDictCode())){
            queryWrapper.eq(SysDict::getDictCode, sysDictDto.getDictCode());
        }
        Page<SysDict> page = new Page<>();
        page.setCurrent(queryDto.getCurrentPage());
        page.setSize(queryDto.getSize());
        return baseMapper.selectPage(page, queryWrapper);
    }

    @Override
    public void enableDict(Long dictId, Integer enabled) {
        if (dictId == null || enabled == null){
            throw new SystemException(ErrorCode.PARAMS_INVALID);
        }
        SysDict sysDict = new SysDict();
        sysDict.setDictId(dictId);
        sysDict.setEnabled(enabled);
        baseMapper.updateById(sysDict);
    }

    @Override
    public void deleteDict(Long dictId) {
        if (dictId == null){
            throw new SystemException(ErrorCode.PARAMS_INVALID);
        }
        baseMapper.deleteById(dictId);
    }

    /**
     * 校验字典信息
     */
    private void checkDict(SysDictDto sysDictDto){
        LambdaQueryWrapper<SysDict> queryWrapper = new LambdaQueryWrapper<>();
        if (sysDictDto.getDictId() != null){
            queryWrapper.ne(SysDict::getDictId, sysDictDto.getDictId());
        }
        if (StrUtil.isEmpty(sysDictDto.getDictName()) || StrUtil.isEmpty(sysDictDto.getDictCode())){
            throw new SystemException(ErrorCode.PARAMS_INVALID);
        }
        queryWrapper.and(wrapper -> wrapper.eq(SysDict::getDictName, sysDictDto.getDictName()).or().eq(SysDict::getDictCode, sysDictDto.getDictCode()));
        long count = baseMapper.selectCount(queryWrapper);
        if (count > 0){
            throw new SystemException(ErrorCode.NAME_OR_CODE_ERROR);
        }
    }
}
